package com.kurt.service;

import com.kurt.dto.DriverDTO;
import com.kurt.dto.create.DriverCreateRequest;
import com.kurt.dto.query.DriverQueryRequest;
import com.kurt.dto.update.DriverUpdateRequest;
import com.kurt.entity.SysDriver;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 驾驶员服务接口
 * 提供驾驶员相关的业务逻辑方法
 */
public interface DriverService extends BaseService<SysDriver, Long> {

    /**
     * 创建驾驶员
     *
     * @param createRequest 创建请求
     * @return 驾驶员信息
     */
    DriverDTO createDriver(DriverCreateRequest createRequest);

    /**
     * 更新驾驶员
     *
     * @param updateRequest 更新请求
     * @return 驾驶员信息
     */
    DriverDTO updateDriver(DriverUpdateRequest updateRequest);

    /**
     * 根据ID获取驾驶员详情
     *
     * @param id 驾驶员ID
     * @return 驾驶员信息
     */
    DriverDTO getDriverById(Long id);

    /**
     * 分页查询驾驶员
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    Page<DriverDTO> getDriverPage(DriverQueryRequest queryRequest);

    /**
     * 根据条件查询驾驶员列表
     *
     * @param queryRequest 查询请求
     * @return 驾驶员列表
     */
    List<DriverDTO> getDriverList(DriverQueryRequest queryRequest);

    /**
     * 删除驾驶员
     *
     * @param id 驾驶员ID
     * @return 是否成功
     */
    boolean deleteDriver(Long id);

    /**
     * 批量删除驾驶员
     *
     * @param ids 驾驶员ID列表
     * @return 是否成功
     */
    boolean deleteDrivers(List<Long> ids);

    /**
     * 根据组织ID获取驾驶员列表
     *
     * @param organizationId 组织ID
     * @return 驾驶员列表
     */
    List<DriverDTO> getDriversByOrganizationId(Long organizationId);

    /**
     * 检查身份证号是否存在
     *
     * @param idCard 身份证号
     * @return 是否存在
     */
    boolean existsByIdCard(String idCard);

    /**
     * 检查身份证号是否存在（排除指定ID）
     *
     * @param idCard    身份证号
     * @param excludeId 排除的驾驶员ID
     * @return 是否存在
     */
    boolean existsByIdCardAndIdNot(String idCard, Long excludeId);

    /**
     * 检查驾驶证号是否存在
     *
     * @param driverLicense 驾驶证号
     * @return 是否存在
     */
    boolean existsByDriverLicense(String driverLicense);

    /**
     * 检查驾驶证号是否存在（排除指定ID）
     *
     * @param driverLicense 驾驶证号
     * @param excludeId     排除的驾驶员ID
     * @return 是否存在
     */
    boolean existsByDriverLicenseAndIdNot(String driverLicense, Long excludeId);

    /**
     * 更新驾驶员状态
     *
     * @param id     驾驶员ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateStatus(Long id, Integer status);
}
